package rmi;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import javax.naming.CommunicationException;

import medicos.IteratorMedicos;
import medicos.Medico;
import medicos.MedicoJaCadastradoException;
import medicos.MedicoNaoEncontradoException;
import medicos.RepositorioMedicosBDR;
import pacientes.IteratorPacientes;
import pacientes.Paciente;
import pacientes.PacienteJaCadastradoException;
import pacientes.PacienteNaoEncontradoException;
import pacientes.RepositorioPacientesBDR;
import planosSaude.IteratorPlanosSaude;
import planosSaude.PlanoSaude;
import planosSaude.PlanoSaudeEncontradoException;
import planosSaude.PlanoSaudeNaoEncontradoException;
import planosSaude.RepositorioPlanosSaudeBDR;
import util.IllegalArgumentException;
import util.RepositorioException;
import consultas.Consulta;
import consultas.ConsultaInexistenteException;
import consultas.ConsultaJaExisteException;
import consultas.IteratorConsultas;
import consultas.RepositorioConsultas;
import consultas.RepositorioConsultasBDR;
import doencas.Doenca;
import doencas.DoencaJaCadastradaException;
import doencas.DoencaNaoEncontradaException;
import doencas.IteratorDoencas;
import doencas.RepositorioDoencasBDR;
import exames.CodigoExameInvalidoException;
import exames.Exame;
import exames.ExameJaCadastradoException;
import exames.ExameNaoEncontradoException;
import exames.IteratorExames;
import exames.RepositorioExamesBDR;
import fachada.Clinica;
import fachada.IClinica;

public class TargetAdapter extends UnicastRemoteObject implements TargetRemoteInterface  {

	private static final long serialVersionUID = 1L;
	
	private IClinica fachada;

	public static void main(String[] args) {
		try {
			System.out.println("Criando serviror...");
			new TargetAdapter(
					Clinica.getInstance(
							RepositorioExamesBDR.getInstance(),
							RepositorioConsultasBDR.getInstance(),
							RepositorioPacientesBDR.getInstance(),
							RepositorioMedicosBDR.getInstance(),
							RepositorioDoencasBDR.getInstance(),
							RepositorioPlanosSaudeBDR.getInstance()
					)
			);
			System.out.println("... criado");			
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}
	
	public TargetAdapter(IClinica clinica) throws RemoteException {
			this.fachada = clinica;
			try {
				Naming.rebind("//localhost:1099/clinica", this);
			} catch (MalformedURLException e) {
				throw new RemoteException(e.getMessage());
			}		
	}
	
	public void atualizarConsulta(Consulta consulta) throws CommunicationException, IllegalArgumentException, ConsultaInexistenteException, RepositorioException, CodigoExameInvalidoException, PacienteNaoEncontradoException, MedicoNaoEncontradoException, ExameNaoEncontradoException, CommunicationException {
		fachada.atualizarConsulta(consulta);
	}

	public void atualizarDoenca(Doenca doenca) throws CommunicationException, DoencaNaoEncontradaException, RepositorioException {
		fachada.atualizarDoenca(doenca);
	}

	public void atualizarExame(Exame exame) throws CommunicationException, ExameNaoEncontradoException, IllegalArgumentException, RepositorioException, PacienteNaoEncontradoException, MedicoNaoEncontradoException {
		fachada.atualizarExame(exame);
	}

	public void atualizarMedico(Medico medico) throws CommunicationException, MedicoNaoEncontradoException, RepositorioException, IllegalArgumentException {
		fachada.atualizarMedico(medico);
	}

	public void atualizarPaciente(Paciente paciente) throws CommunicationException, PacienteNaoEncontradoException, RepositorioException, PlanoSaudeNaoEncontradoException, IllegalArgumentException {
		fachada.atualizarPaciente(paciente);
	}

	public void atualizarPlanoSaude(PlanoSaude planoSaude) throws CommunicationException, PlanoSaudeNaoEncontradoException, RepositorioException {
		fachada.atualizarPlanoSaude(planoSaude);
	}

	public void cadastrarConsulta(Consulta consulta) throws CommunicationException, IllegalArgumentException, ConsultaJaExisteException, RepositorioException, CodigoExameInvalidoException, MedicoNaoEncontradoException, PacienteNaoEncontradoException {
		fachada.cadastrarConsulta(consulta);
	}

	public void cadastrarDoenca(Doenca doenca) throws CommunicationException, DoencaJaCadastradaException, DoencaNaoEncontradaException, RepositorioException {
		fachada.cadastrarDoenca(doenca);
	}

	public void cadastrarExame(Exame exame) throws CommunicationException, ExameJaCadastradoException, RepositorioException, IllegalArgumentException, PacienteNaoEncontradoException, MedicoNaoEncontradoException {
		fachada.cadastrarExame(exame);
	}

	public void cadastrarMedico(Medico medico) throws CommunicationException, MedicoJaCadastradoException, RepositorioException {
		fachada.cadastrarMedico(medico);
	}

	public void cadastrarPaciente(Paciente paciente) throws CommunicationException, PacienteJaCadastradoException, RepositorioException, PlanoSaudeNaoEncontradoException {
		fachada.cadastrarPaciente(paciente);
	}

	public void cadastrarPlanoSaude(PlanoSaude planoSaude) throws CommunicationException, RepositorioException, PlanoSaudeEncontradoException {
		fachada.cadastrarPlanoSaude(planoSaude);
	}

	public IteratorConsultas getConsultas() throws CommunicationException, RepositorioException {
		return fachada.getConsultas();
	}

	public IteratorDoencas getDoencas() throws CommunicationException, RepositorioException {
		return fachada.getDoencas();
	}

	public IteratorExames getExames() throws CommunicationException, RepositorioException {
		return fachada.getExames();
	}

	public IteratorMedicos getMedicos() throws CommunicationException, RepositorioException {
		return fachada.getMedicos();
	}

	public IteratorPacientes getPacientes() throws CommunicationException, RepositorioException {
		return fachada.getPacientes();
	}

	public IteratorPlanosSaude getPlanos() throws CommunicationException, RepositorioException {
		return fachada.getPlanos();
	}

	public Consulta procurarConsulta(long codigo) throws CommunicationException, ConsultaInexistenteException, RepositorioException {
		return fachada.procurarConsulta(codigo);
	}

	public RepositorioConsultas procurarConsulta(Consulta consulta) throws CommunicationException, ConsultaInexistenteException, RepositorioException, java.lang.IllegalArgumentException, IllegalArgumentException {
		return fachada.procurarConsulta(consulta);
	}

	public Doenca procurarDoenca(long codigo) throws CommunicationException, DoencaNaoEncontradaException, RepositorioException {
		Doenca doenca = fachada.procurarDoenca(codigo);
		System.out.println("Efetuada uma Consulta na tabela 'doencas'.");
		return doenca;
		
	}

	public Exame procurarExame(long codigo) throws CommunicationException, ExameNaoEncontradoException, RepositorioException  {
		return fachada.procurarExame(codigo);
	}

	public Medico procurarMedico(long codigo) throws CommunicationException, MedicoNaoEncontradoException, RepositorioException {
		return fachada.procurarMedico(codigo);
	}

	public Paciente procurarPaciente(long codigo) throws CommunicationException, PacienteNaoEncontradoException, RepositorioException {
		return fachada.procurarPaciente(codigo);
	}

	public PlanoSaude procurarPlanoSaude(long codigo) throws CommunicationException, PlanoSaudeNaoEncontradoException, RepositorioException {
		PlanoSaude planoSaude = fachada.procurarPlanoSaude(codigo);
		System.out.println("Efetuada uma consulta na tabela PlanosSaude.");
		return planoSaude;
	}

	public void removerConsulta(long codigo) throws CommunicationException, IllegalArgumentException, ConsultaInexistenteException, RepositorioException {
		fachada.removerConsulta(codigo);
	}

	public void removerDoenca(long codigo) throws CommunicationException, DoencaNaoEncontradaException, RepositorioException {
		fachada.removerDoenca(codigo);
	}

	public void removerExame(long codigo) throws CommunicationException, ExameNaoEncontradoException, RepositorioException {
		fachada.removerExame(codigo);
	}

	public void removerMedico(long codigo) throws CommunicationException, MedicoNaoEncontradoException, RepositorioException {
		fachada.removerMedico(codigo);
	}

	public void removerPaciente(long codigo) throws CommunicationException, PacienteNaoEncontradoException, RepositorioException {
		fachada.removerPaciente(codigo);
	}

	public void removerPlanoSaude(long codigo) throws CommunicationException, PlanoSaudeNaoEncontradoException, RepositorioException {
		fachada.removerPlanoSaude(codigo);
	}


}
